﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;
using System.Web.UI.HtmlControls;

namespace AudiPyme.UI
{
    public partial class ActivosConsulta : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                int IdEmpresa = DatosEmpresa();
                if (IdEmpresa != -1)
                {
                    ModeloContainer agenteBD = new ModeloContainer();
                    int nActivos = ActivosEmpresaFactory.NumeroTotalesActivosEmpresa(IdEmpresa);
                    if (nActivos == 0)
                    {
                        MuestraMensaje("La Empresa no tiene ningún activo en la Base de Datos");
                        PnlGV.Visible = false;
                    }
                    else
                    {

                        //Número de activos seleccionados actualmente
                        int nActivosOn = 0;
                        //Inicializamos la estructura con el número de activos que tiene actualmente la empresa
                        List<int> Contador = new List<int>(nActivos);
                        //Inicializamos la estructura
                        for (int i = 0; i < Contador.Capacity; i++)
                        {
                            Contador.Insert(i, 0);
                        }
                        String OpcionFiltro = RblFiltro.SelectedValue;
                        String TextoBuscar = TxtFiltro.Text;
                        LlenaGridView(OpcionFiltro, TextoBuscar);
                        //Inicializamos la estructura que va a almacenar los estados de los activos
                        List<ActivoEmpresaCheck> CheckList = new List<ActivoEmpresaCheck>(nActivos);
                        //Guardamos en variables de sesión
                        Session["CheckList"] = CheckList;
                        Session["nControlesOn"] = nActivosOn;
                    }
                }
                else
                {
                    MuestraMensaje("No se pudo recoger la empresa");
                }
            }
        }

        //Método que se ejecuta al evento de cliquear uno de los checkbox de cualquier activo de la tabla
        protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                //Recuperamos las variables de sesión
                //Recogemos el valor de las relaciones seleccionadas en las otras paginas del GridView
                //con la variable de sesión nControlesOn
                int nActivosOn = (int)Session["nControlesOn"];
                List<ActivoEmpresaCheck> CheckList = (List<ActivoEmpresaCheck>)Session["Checklist"];
                //Recorremos la página que el gridview muestra
                foreach (GridViewRow row in GVActivosEmp.Rows)
                {
                    //Recogemos el control CheckBox de cada fila del gridview
                    CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                    //Recogemos el Id del Activo
                    int IdActivo;
                    int.TryParse(GVActivosEmp.Rows[row.RowIndex].Cells[0].Text, out IdActivo);
                    //Si es la primera vez que se elige esa relación, aumentamos el contador
                    //y marcamos que esa relación ya está elegida
                    if (Chk.Checked == true && !EstaRelacion(CheckList, IdActivo))
                    {
                        if (nActivosOn == 0)
                        {
                            BtnEliminar.Enabled = true;
                        }
                        CheckList.Add(new ActivoEmpresaCheck(IdActivo, true));
                        nActivosOn++;
                    }
                    //Sino marcamos que la relación no está elegida y actualizamos estructuras
                    else if (Chk.Checked == false && EstaRelacion(CheckList, IdActivo))
                    {
                        //Eliminamos las ocurrencias guardadas anteriormente de la relación
                        for (int i = 0; i < CheckList.Count(); i++)
                        {
                            if (CheckList[i].IdActivo == IdActivo)
                            {
                                CheckList.RemoveAt(i);
                            }
                        }

                        nActivosOn--;
                        if (nActivosOn == 0)
                        {
                            BtnEliminar.Enabled = false;
                        }
                    }
                }
                //Si estamos en la opción de elementos Seleccionados, actualizamos el gridview
                String OpcionFiltro = RblFiltro.SelectedValue;
                if (OpcionFiltro.Equals("RelacSelec"))
                {
                    GridViewRelacionesSeleccionadas();
                }
                //Actualizamos el número de activos elegidos en el label
                LblControl.Text = nActivosOn.ToString();
                //Guardamos en la variable de sesión
                Session["CheckList"] = CheckList;
                Session["nControlesOn"] = nActivosOn;
            }
        }

        //Método que devuelve si un activo está en la lista CheckList de activos seleccionados
        private bool EstaRelacion(List<ActivoEmpresaCheck> CheckList, int IdActivo)
        {
            for (int i = 0; i < CheckList.Count(); i++)
            {
                if (CheckList[i].IdActivo == IdActivo)
                {
                    return true;
                }
            }
            return false;
        }


        //Indica si un activo está entre los seleccionados
        private int IndiceActivo(List<ActivoEmpresaCheck> CheckList, int IdActivo)
        {
            for (int i = 0; i < CheckList.Count(); i++)
            {
                if (CheckList[i].IdActivo == IdActivo)
                {
                    return i;
                }
            }
            return -1;
        }

        protected void GVActivosEmp_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                //Recogemos el array tipado con el valor de los activos que han sido elegidos
                List<ActivoEmpresaCheck> CheckList = (List<ActivoEmpresaCheck>)Session["Checklist"];
                //Recorremos el Gridview antes de cambiar de página
                foreach (GridViewRow row in GVActivosEmp.Rows)
                {
                    //Recogemos el control CheckBox de cada fila
                    CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                    //Si está seleccionado
                    if (Chk.Checked == true)
                    {
                        //Recogemos el IdActivo de la fila
                        int IdActivo;
                        int.TryParse(GVActivosEmp.Rows[row.RowIndex].Cells[0].Text, out IdActivo);
                    }
                    //Si no está seleccionado
                    if (Chk.Checked == false)
                    {
                        //Recogemos el IdActivo de la fila
                        int IdActivo;
                        int.TryParse(GVActivosEmp.Rows[row.RowIndex].Cells[0].Text, out IdActivo);
                        //Actualizamos el valor de contador
                        if (EstaRelacion(CheckList, IdActivo))
                        {
                            int indice = IndiceActivo(CheckList, IdActivo);
                            CheckList.RemoveAt(indice);
                        }
                    }
                }
                //Actualizamos la variable de sesión
                this.GVActivosEmp.PageIndex = e.NewPageIndex;
                Session["CheckList"] = CheckList;
                String OpcionFiltro = RblFiltro.SelectedValue;
                if (OpcionFiltro.Equals("RelacSelec"))
                {
                    GridViewRelacionesSeleccionadas();
                }
                else
                {
                    String TextoBuscar = TxtFiltro.Text;
                    LlenaGridView(OpcionFiltro, TextoBuscar);
                    ActualizaCheckListTabla();
                }
            }
        }

        private void GridViewRelacionesSeleccionadas()
        {
            ModeloContainer agenteBD = new ModeloContainer();
            //Recogemos el array tipado con el valor de los activo que han sido elegidos
            List<ActivoEmpresaCheck> CheckList = (List<ActivoEmpresaCheck>)Session["Checklist"];
            List<ActivoConsultaAux> LRelacionesSelec = new List<ActivoConsultaAux>();
            //Cargamos el valor de los activos que estuvieran seleccionados anteriormente
            for (int i = 0; i < CheckList.Count(); i++)
            {
                if (CheckList[i].ValorCheck == true)
                {
                    ActivoConsultaAux nuevaFila = new ActivoConsultaAux();
                    nuevaFila.IdActivo = CheckList[i].IdActivo;
                    nuevaFila.Nombre = ActivosEmpresaFactory.NombreActivo(CheckList[i].IdActivo);
                    nuevaFila.TipoActivo = ActivosEmpresaFactory.NombreTipoActivoActivo(CheckList[i].IdActivo);
                    nuevaFila.Descripcion = ActivosEmpresaFactory.DescripcionActivo(CheckList[i].IdActivo);
                    nuevaFila.CosteActivo = ActivosEmpresaFactory.CosteActivo(CheckList[i].IdActivo);
                    int IdValorEstrategic = ActivosEmpresaFactory.ValorEstrategicoActivo(CheckList[i].IdActivo);
                    nuevaFila.ValorEstrategico = ActivoConsultaAux.MapeaValoresActivo(IdValorEstrategic);
                    LRelacionesSelec.Add(nuevaFila);
                }
            }
            GVActivosEmp.DataSource = LRelacionesSelec;
            DataBind();
            ActualizaCheckListTabla();
        }

        private void ActualizaCheckListTabla()
        {
            //Recogemos el array tipado con el valor de los activos que han sido elegidos
            List<ActivoEmpresaCheck> CheckList = (List<ActivoEmpresaCheck>)Session["Checklist"];
            //Cargamos el valor de los activos que estuvieran seleccionados anteriormente
            for (int i = 0; i < CheckList.Count(); i++)
            {
                foreach (GridViewRow row in GVActivosEmp.Rows)
                {
                    int IdActivo;
                    int.TryParse(GVActivosEmp.Rows[row.RowIndex].Cells[0].Text, out IdActivo);
                    if (IdActivo == CheckList[i].IdActivo)
                    {
                        CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                        if (CheckList[i].ValorCheck)
                        {
                            Chk.Checked = true;
                        }
                        else
                        {
                            Chk.Checked = false;
                        }
                    }
                }
            }
        }

        protected void BtnEliminar_Click(object sender, EventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                ModeloContainer agenteBD = new ModeloContainer();
                //Recogemos los activos seleccionados presentes en el CheckList
                List<ActivoEmpresaCheck> CheckList = (List<ActivoEmpresaCheck>)Session["Checklist"];
                ActivosEmpresaNegocio.EliminarActivosEmpresa(CheckList, IdEmpresa);
                MuestraMensajeRedirige("Activos Eliminados Correctamente", "ActivosPrincipal");

            }
        }

        //Método que actualiza la tabla 
        private void LlenaGridView(String OpcionFiltro, String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            String NombreUsuario = (String)Session["nombreUsuario"];
            int IdEmpresa = UsuariosFactory.EmpresaUsuario(NombreUsuario);
            if (IdEmpresa != 0)
            {
                OpcionFiltro = RblFiltro.SelectedValue;
                TextoBuscar = TxtFiltro.Text;
                List<ActivoConsultaAux> LActivos = ActivoConsultaAux.ActivosEmpresaTabla(IdEmpresa);
                GVActivosEmp.DataSource = LActivos;
                DataBind();
                //Si no se ha introducido texto de búsqueda, sacamos todas los activos disponibles
                if (TextoBuscar.Equals("") || OpcionFiltro.Equals(""))
                {
                    //Recogemos los activos actuales que tiene la empresa
                    LActivos = ActivoConsultaAux.ActivosEmpresaTabla(IdEmpresa);
                }
                else
                {
                    switch (OpcionFiltro)
                    {
                        case "Nombre":
                            //Activos de la empresa con el Filtro de Nombre de Activo
                            LActivos = ActivoConsultaAux.ActivosEmpresaTablaPorNombre(TextoBuscar, IdEmpresa);
                            break;
                        case "TipoActivo":
                            //Activos de la empresa con el Filtro de Nombre de Tipo de Activo
                            LActivos = ActivoConsultaAux.ActivosEmpresaTablaPorTipoActivo(TextoBuscar, IdEmpresa);
                            break;
                        default:
                            MuestraMensaje("No se recogio la opcion de Filtro elegida");
                            break;
                    }
                    if (LActivos.Count() == 0)
                    {
                        MuestraMensaje("No se encontraron elementos cuyo " + OpcionFiltro + " contuvieran la secuencia " + TextoBuscar);
                    }
                    else
                    {
                        GVActivosEmp.DataSource = LActivos;
                        DataBind();
                    }
                }
            }
            else
            {
                MuestraMensaje("No hay una empresa asociada al usuario " + NombreUsuario);
            }
        }

        private int DatosEmpresa()
        {
            try
            {
                int IdEmpresa = -1;
                String nombreUsuario = (String)Session["nombreUsuario"];
                if (String.IsNullOrEmpty(nombreUsuario))
                {
                    MuestraMensaje("No se pudo encontrar el usuario");
                    return -1;
                }
                else
                {
                    IdEmpresa = UsuariosFactory.EmpresaUsuario(nombreUsuario);
                    if (IdEmpresa == 0)
                    {
                        MuestraMensaje("El usuario " + nombreUsuario + " no esta asociado a una empresa");
                        return -1;
                    }
                    else
                    {
                        return IdEmpresa;
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                Session.Clear();
                Session.Abandon();
                MuestraMensajeRedirige("Error al recoger la variable de sesión. La aplicación se cerrará por motivos de seguridad", "InicioSesion");
                return -1;
            }
        }

        private void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        protected void RblFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (RblFiltro.SelectedValue.Equals("RelacSelec"))
            {
                TxtFiltro.Visible = false;
                BtnBuscar.Visible = false;
                GridViewRelacionesSeleccionadas();
            }
            else
            {
                TxtFiltro.Visible = true;
                BtnBuscar.Visible = true;
                //Limpiamos el TextBox ya que venimos de otra opción
                TxtFiltro.Text = "";
                String OpcionFiltro = RblFiltro.SelectedValue;
                String TextoBuscar = TxtFiltro.Text;
                LlenaGridView(OpcionFiltro, TextoBuscar);
                ActualizaCheckListTabla();
            }
        }

        protected void BtnBuscar_Click(object sender, EventArgs e)
        {
            String OpcionFiltro = RblFiltro.SelectedValue;
            String TextoBuscar = TxtFiltro.Text;
            LlenaGridView(OpcionFiltro, TextoBuscar);
            ActualizaCheckListTabla();
        }

        private void MuestraMensajeRedirige(string Mensaje, string Pagina)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            SB.Append("var vers = navigator.appVersion;if(vers.indexOf('MSIE 7.0') != -1) { window.location='" + Pagina + ".aspx';} else{ window.location='" + Pagina + ".aspx'; }");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

    }
}